﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace IR.WPF.UI
{
	// Example usage:
	//// To use this class within your viewmodel class:
	//RelayCommand _myCommand;
	//public ICommand MyCommand
	//{
	//	get
	//	{
	//		if (_myCommand == null)
	//		{
	//			_myCommand = new RelayCommand(p => this.DoMyCommand(p),
	//				p => this.CanDoMyCommand(p) );
	//		}
	//		return _myCommand;
	//	}
	//}

	/// <summary>
	/// RelayCommand created by Josh Smith; source http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030
	/// </summary>
	public class RelayCommand : ICommand
	{
		#region Fields

		readonly Action<object> _execute;
		readonly Predicate<object> _canExecute;

		#endregion // Fields

		#region Constructors

		public RelayCommand(Action<object> execute)
			: this(execute, null)
		{
		}

		public RelayCommand(Action<object> execute, Predicate<object> canExecute)
		{
			if (execute == null)
				throw new ArgumentNullException("execute");

			_execute = execute;
			_canExecute = canExecute;
		}
		#endregion // Constructors

		#region ICommand Members

		[DebuggerStepThrough]
		public bool CanExecute(object parameter)
		{
			return _canExecute == null ? true : _canExecute(parameter);
		}

		public event EventHandler CanExecuteChanged
		{
			add { CommandManager.RequerySuggested += value; }
			remove { CommandManager.RequerySuggested -= value; }
		}

		public void RaiseCanExecuteChanged()
		{
			CommandManager.InvalidateRequerySuggested();
		}

		public void Execute(object parameter)
		{
			_execute(parameter);
		}

		#endregion // ICommand Members
	}
}
